﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 接口和抽象类
{

//    SOLID是五个面向对象的设计原则，可以帮助设计者设计出更好的软件架构。
//    这些原则分别是
//    单一职责原则（Single Responsibility Principle）、
//    开放封闭原则（Open/Closed Principle）、
//    里氏替换原则（Liskov Substitution Principle）、
//    接口隔离原则（Interface Segregation Principle）和
//    依赖倒置原则（Dependency Inversion Principle）。

//单一职责原则：一个类只做一件事。一个类应该只有一个职责，或者说一个类只负责一项功能。
//这样可以提高代码的可读性和可维护性，并且降低类之间的耦合度。

//开放封闭原则：软件实体（类、模块、函数等）应当对扩展开放，对修改封闭。也就是说，
//设计的时候应该使得软件实体可以在不修改源代码的情况下进行扩展和修改，而修改的代价应该是最小的。

//里氏替换原则：如果S是B的子类，则程序中使用B类型的对象的地方都可以使用S类型的对象，
//而不会引入任何错误。也就是说，子类必须能够替换它们的基类。

//接口隔离原则：客户端不应该依赖于它们不使用的接口。接口隔离原则要求将大接口拆分成小接口，
//每个接口只提供客户端需要的特定方法，而不是提供一个大而全的接口。这样可以降低客户端的耦合度，
//提高代码的可读性和可维护性。

//依赖倒置原则：高层模块不应该依赖于底层模块，两者都应该依赖于抽象。抽象不应该依赖于细节，
//细节应该依赖于抽象。这样可以降低类之间的耦合度，提高代码的可读性和可维护性。

//这些SOLID设计原则是面向对象设计的核心理念，可以帮助设计者设计出更加健壮、
//灵活和可维护的软件系统。





    internal class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Run();
            car.Stop();
            car.Fill();

            Console.ReadKey();

        }
    }


    // 抽象类
    abstract class ClassA
    {
        public abstract void test();
    }

    // 抽象类的子类，需要实现抽象的方法
    class Child : ClassA
    {
        public override void test()
        {
            throw new NotImplementedException();
        }
    }


    // 抽象类，有抽象方法，但又不是所有的都是抽象方法
    abstract class Vehicle:VehicleBase
    {
        public abstract void Stop(); // 抽象方法

        public virtual void Run()
        {
            Console.WriteLine("run...");
        }

        public void Fill()
        {
            Console.WriteLine("fill...");
        }
    }

    // 接口，纯虚类
    interface VehicleBase
    {
        void Run();
        void Stop();
        void Fill();
    }

    class Car : Vehicle
    {
        /// <summary>
        /// 车的停止方法
        /// </summary>
        public override void Stop()
        {
            Console.WriteLine("car stop...");
        }
        public override void Run()
        {
            Console.WriteLine("car run...");
        }

        //public void Fill()
        //{
        //    Console.WriteLine("car fill...");
        //}
    }

    class Truck : Vehicle
    {
        /// <summary>
        /// 卡车的停止方法
        /// </summary>
        public override void Stop()
        {
            Console.WriteLine("truck stop...");
        }

        public override void Run()
        {
            Console.WriteLine("truck run...");
        }
    }
}
